using System;
using System.Globalization;
using System.Data;
using System.Collections;
using System.Text;

namespace SistemaLib.sipe.util
{
	/// <summary>
	/// Summary description for Func.
	/// </summary>
	public class Func
	{
		public Func()
		{
			//
			// TODO: Add constructor logic here
			//
		}

		public static bool FechasIguales( DateTime fecha1, DateTime fecha2)
		{
			if ( fecha1.Year == fecha2.Year && fecha1.Month == fecha2.Month && fecha1.Day == fecha2.Day )
			{
				return true;
			} 
			else 
			{
				return false;
			}
		}

		public static bool FechaNula( DateTime fecha)
		{
            if (fecha == null || fecha.Day == sipe.consts.generales.FECHA_NULL.Day && fecha.Month == sipe.consts.generales.FECHA_NULL.Month && fecha.Year == sipe.consts.generales.FECHA_NULL.Year)
			{
				return true;
			} 
			else 
			{
				return false;
			}
		}

		public static string[] RetornaTokensBarra( string linea)
		{
			char[] sep = new char[1];
			sep[0]='|';

			return RetornaTokens( linea, sep);
		}

		public static string[] RetornaTokensTabulado( string linea)
		{
			char[] sep = new char[1];
			sep[0] = Convert.ToChar( 9);

			return RetornaTokens( linea, sep);
		}

		public static string[] RetornaTokens( string linea, char[] sep)
		{
			string[] tokens = linea.Split(sep);
			
			return tokens;
		}

		public DateTime CadenaToFecha( string fecha)
		{
            // Mejorar la validacion
            if (fecha.Trim() == "")
                return consts.generales.FECHA_NULL;
            else
            {
                int anio, mes, dia;
                dia = int.Parse(fecha.Substring(0, 2));
                mes = int.Parse(fecha.Substring(3, 2));
                anio = int.Parse(fecha.Substring(6, 4));

                return new DateTime(anio, mes, dia);
            }			
		}

		public static string FechaToCadena( DateTime fecha)
		{
			if ( FechaNula( fecha))
			{
				return "";
			}
			else
			{
				return fecha.ToString( "dd/MM/yyyy");
			}
		}


		public static string HoraToCadena( DateTime hora)
		{
			return hora.ToString( "HH:mm");
		}

		public static DateTime FechaYHoraToDateTime( string fecha, string hora)
		{
			// dd/mm/yyyy hh:mm
			char[] sep = new char[1];
			sep[0] = char.Parse( "/");

			string[] comp = fecha.Split( sep);

			int dia, mes, anio, h, min;
			
			dia = int.Parse( comp[0]);
			mes = int.Parse( comp[1]);
			anio = int.Parse( comp[2]);

			h = int.Parse( hora.Substring(0,2));
			min = int.Parse( hora.Substring(3,2));

			return new DateTime( anio, mes, dia, h, min, 0);

		}

        public static int RetornaDiaDeLaSemana(string dia)
        {
            int diaDeLaSemana = 0;
            switch (dia)
            {
                case "Monday":
                    diaDeLaSemana = 1;
                    break;
                case "Tuesday":
                    diaDeLaSemana = 2;
                    break;
                case "Wednesday":
                    diaDeLaSemana = 3;
                    break;
                case "Thursday":
                    diaDeLaSemana = 4;
                    break;
                case "Friday":
                    diaDeLaSemana = 5;
                    break;
                case "Saturday":
                    diaDeLaSemana = 6;
                    break;
                case "Sunday":
                    diaDeLaSemana = 7;
                    break;
            }
            return diaDeLaSemana;
        }

		public static DateTime CadenaToDateTime( string fecha)
		{
			// dd/mm/yyyy

			fecha = fecha.Trim();

			if ( fecha == "" )
			{
				return SistemaLib.sipe.consts.generales.FECHA_NULL;
			}
			else
			{
				char[] sep = new char[2];
				sep[0] = char.Parse( "/");
				sep[1] = char.Parse( "-");

				string[] comp = fecha.Split( sep);

				int dia, mes, anio;
			
				dia = int.Parse( comp[0]);
				mes = int.Parse( comp[1]);
				anio = int.Parse( comp[2]);

				return new DateTime( anio, mes, dia);
			}

		}

		public static string DecimalToCadena4Decimales( decimal numero)
		{			
			NumberFormatInfo nfi = new NumberFormatInfo();
			nfi.NumberNegativePattern = 1;
			nfi.NumberDecimalSeparator = ".";
			nfi.NumberGroupSeparator = "";
			nfi.NumberDecimalDigits = 4;
			string nro = numero.ToString("N",nfi);
			return nro;
		}

		public static string DecimalToCadena2Decimales( decimal numero)
		{
			NumberFormatInfo nfi = new NumberFormatInfo();
			nfi.NumberNegativePattern = 1;
			nfi.NumberDecimalSeparator = ",";
			nfi.NumberGroupSeparator = "";
			nfi.NumberDecimalDigits = 2;
			string nro = numero.ToString("N",nfi);
			return nro;
		}

		public static string DecimalToCadena2DecimalesSepMiles( decimal numero)
		{
			NumberFormatInfo nfi = new NumberFormatInfo();
			nfi.NumberNegativePattern = 1;
			nfi.NumberDecimalSeparator = ",";
			nfi.NumberGroupSeparator = ".";
			nfi.NumberDecimalDigits = 2;
			string nro = numero.ToString("N",nfi);
			return nro;
		}

        public static string DecimalToCadenaSinDecimalesSepMiles(decimal numero)
        {
            NumberFormatInfo nfi = new NumberFormatInfo();
            nfi.NumberNegativePattern = 1;
            nfi.NumberDecimalSeparator = ",";
            nfi.NumberGroupSeparator = ".";
            nfi.NumberDecimalDigits = 0;
            string nro = numero.ToString("N", nfi);
            return nro;
        }

		public static string DecimalToCadena( decimal numero)
		{
			return numero.ToString( "N2");
		}

		public static string DecimalToCadenaSinSepMiles (decimal numero)
		{			
			string nro = numero.ToString("N2");
			for (int i = 0; i < nro.Length ; i++)
			{
				if ( nro[i].ToString() == ".")
				{
					nro = nro.Remove(i,1);
				}
				else
				{
					if( nro[i].ToString() == ",")
					{
						nro = nro.Replace(",",".");
					}
				}
			}
			return nro;
		}

        public static string FloatToCadena2DecimalesGrafico(float numero)
        {
            NumberFormatInfo nfi = new NumberFormatInfo();
            nfi.NumberNegativePattern = 1;
            nfi.NumberDecimalSeparator = ".";
            nfi.NumberGroupSeparator = ",";
            nfi.NumberDecimalDigits = 2;
            string nro = numero.ToString("N", nfi);
            return nro;
        }

        public static string DecimalToCadena2DecimalesGrafico(decimal numero)
        {
            NumberFormatInfo nfi = new NumberFormatInfo();
            nfi.NumberNegativePattern = 1;
            nfi.NumberDecimalSeparator = ".";
            nfi.NumberGroupSeparator = "";
            nfi.NumberDecimalDigits = 2;
            string nro = numero.ToString("N", nfi);
            return nro;
        }

        public static string DecimalToCadena2DecimalesReloj(decimal numero)
        {
            return DecimalToCadenaSinSepMiles(numero);
        }

		public static decimal CadenaToDecimal( string numero)
		{
			if ( numero.Trim() == "" )
				return 0;

			NumberFormatInfo nfi = new NumberFormatInfo();
			nfi.NumberNegativePattern = 1;
			numero = numero.Replace( ",", ".");
			
			return Convert.ToDecimal( numero, nfi);
		}

		public static decimal CadenaConSepMilesToDecimal( string numero)
		{
			if ( numero.Trim() == "" )
				return 0;

            if ( numero.IndexOf( '.') >= 0 && numero.IndexOf( ',') < 0 )
                numero = numero.Replace( '.', ',');
		
			NumberFormatInfo nfi = new NumberFormatInfo();
			nfi.NumberNegativePattern = 1;
			nfi.NumberDecimalSeparator = ",";
			nfi.NumberGroupSeparator = ".";
			nfi.NumberDecimalDigits = 2;

			return Convert.ToDecimal( numero, nfi);
		}

		public static int CadenaToInt( string numero)
		{
			string resu = "0";
			for( int i = 0; i < numero.Length; i++)
			{
				char letra = numero[i];
				byte ascii = Convert.ToByte( letra);
				if ( ascii >= 48 && ascii <= 57 )
				{
					resu += letra.ToString();
				}
				else
				{
					break;
				}
			}

			return int.Parse( resu);
		}

		public static void PaginarDataSet( DataSet ds, int pagina, int regPorPagina)
		{
			int li, ls;

			li = ( pagina - 1 ) * regPorPagina + 1;
			ls = pagina * regPorPagina;

			DataTable tabla = ds.Tables[0];

			int total = tabla.Rows.Count;

			if ( li > total )
				return;
			
			for( int i = 0; i < (li - 1); i++)
			{
				tabla.Rows.RemoveAt( 0);
			}

			
			for( int i = ls ; i < total; i++)
			{
				tabla.Rows.RemoveAt( regPorPagina );
			}

		}

		public static int CantidadDePaginasAPaginar( int cantRegistros, int regPorPagina)
		{
			if ( cantRegistros % regPorPagina != 0 )
				return 1 + cantRegistros / regPorPagina;
			else
				return cantRegistros / regPorPagina;
		}

		public static DateTime ObtenerFechaDesde( DateTime fecha )
		{
			// La fecha desde se tomo como INCLUSIVE. Por lo cual llevo la fecha al primer momento del dia actual.
			return new DateTime( fecha.Year, fecha.Month, fecha.Day);
		}

		public static DateTime ObtenerFechaHasta( DateTime fecha )
		{
			// La fecha hasta se tomo como INCLUSIVE. Por lo cual llevo la fecha al primer momento del dia siguiente.
			DateTime fechaHasta = fecha.AddDays(1);
			fechaHasta = new DateTime( fechaHasta.Year, fechaHasta.Month, fechaHasta.Day);
			return fechaHasta;

		}

		public static string QuitarCaracter(string palabra,char caracter)
		{
			string resultado = "";
			for(int i = 0; i < palabra.Length;i++)
			{
                if(palabra[i] != caracter)
					resultado+=palabra[i];
			}
			return resultado;
		}

		public static string AseguraLargoReemplazo( string cadena, int largo, char carReemp, bool sacaDerecha)
		{
			string resu = "";

			if ( cadena == null )
				cadena = "";

			resu = cadena;

			if ( resu.Length > largo )
			{
				if ( sacaDerecha )
					resu = resu.Substring(0,largo);
				else
					resu = resu.Substring(0 + resu.Length - largo);
			}

			if ( resu.Length < largo)
				resu = resu.PadLeft(largo, carReemp);

			return resu;
		}

		public static DataTable TotalizarDataset(DataSet ds , ArrayList columnas)
		{
			DataTable tabla = new DataTable("totales");
			foreach(ColumnaDataset col in columnas )
			{
				tabla.Columns.Add(col.Titulo);
			}
            
			DataRow total = tabla.NewRow();
			for ( int i = 0 ; i < ds.Tables[0].Rows.Count ; i++)
			{
				foreach(ColumnaDataset col in columnas )
				{
					if(i == 0)
						total[col.Titulo] = 0.ToString();
					if(ds.Tables[0].Rows[i][col.Posicion] != System.DBNull.Value)
					{						
						if(col.Tipo == ColumnaDataset.TIPO_CUENTA)
						{
							int valor = int.Parse(total[col.Titulo].ToString()) + 1;
							total[col.Titulo] = valor.ToString();
						}
						else if(col.Tipo == ColumnaDataset.TIPO_SUMA)
						{
							string val = total[col.Titulo].ToString();
							decimal valor = CadenaConSepMilesToDecimal(val) + CadenaToDecimal(ds.Tables[0].Rows[i][col.Posicion].ToString());
							total[col.Titulo] = DecimalToCadena2DecimalesSepMiles(valor);
						}
					}						
				}
			}
			tabla.Rows.Add(total);
			return tabla;
		}

        public static string RepetirString(string str, int iters)
        {

            StringBuilder builder = new StringBuilder();

            for (int i = 0; i < iters; i++)
            {
                builder.Append(str);
            }

            return builder.ToString();
        }
	}
}
